package com.PTA.KeSheGUI;


//AppWindow窗口有名字分别为“选择级别”和“选择图像”的菜单，级别依次为“初级”和“高级”。
//用户可以自己“选择一幅新图像”或“使用默认像”，窗口有单选按钮，名字依次为数字玩法和图像玩法，在同一时刻只能有一个处于选中状态。

import com.PTA.KeSheView.PuzzlePad;

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

// 主窗口类，继承 JFrame 并实现 ActionListener 接口
public class AppWindow extends JFrame implements ActionListener {
    PuzzlePad puzzlePad; // 拼图面板组件
    JMenuBar bar; // 菜单栏
    JMenu gradeMenu, choiceImage; // 菜单项：选择级别和选择图像
    JMenuItem oneGrade, twoGrade, newImage, defaultImage; // 菜单子项：初级、高级、选择新图像、使用默认图像
    JRadioButton digitPlay, imagePlay; // 单选按钮：数字玩法、图像玩法
    ButtonGroup group = null; // 单选按钮组
    JButton startButton; // 开始按钮
    Image image; // 当前使用的图像
    Toolkit tool; // 工具类，用于加载图像

    // 构造方法，初始化窗口和组件
    public AppWindow() {
        tool = getToolkit(); // 获取默认工具包

        // 创建菜单栏及其子菜单
        bar = new JMenuBar();
        gradeMenu = new JMenu("选择级别");
        choiceImage = new JMenu("选择图像");

        // 创建菜单项并添加到菜单中
        oneGrade = new JMenuItem("初级");
        twoGrade = new JMenuItem("高级");
        newImage = new JMenuItem("选择新图像");
        defaultImage = new JMenuItem("使用默认图像");
        gradeMenu.add(oneGrade);
        gradeMenu.add(twoGrade);
        choiceImage.add(newImage);
        choiceImage.add(defaultImage);

        // 将菜单添加到菜单栏
        bar.add(gradeMenu);
        bar.add(choiceImage);
        setJMenuBar(bar); // 设置窗口的菜单栏

        // 为菜单项添加监听器
        oneGrade.addActionListener(this);
        twoGrade.addActionListener(this);
        newImage.addActionListener(this);
        defaultImage.addActionListener(this);

        // 初始化开始按钮并添加监听器
        startButton = new JButton("开始");
        startButton.addActionListener(this);

        // 初始化单选按钮及其按钮组
        group = new ButtonGroup();
        digitPlay = new JRadioButton("数字玩法");
        imagePlay = new JRadioButton("图像玩法");
        group.add(digitPlay);
        group.add(imagePlay);

        // 初始化拼图面板并设置默认状态
        puzzlePad = new PuzzlePad();
        puzzlePad.setGrade(1); // 默认级别：初级
        puzzlePad.setIsDigitPlay(); // 默认玩法：数字玩法

        // 布局设置
        add(puzzlePad, BorderLayout.CENTER); // 将拼图面板添加到窗口中央

        JPanel pNorth = new JPanel(); // 北部面板
        pNorth.add(digitPlay);
        pNorth.add(imagePlay);
        pNorth.add(startButton);
        pNorth.add(new JLabel("如果图像不能立刻显示，请再单击一次按钮")); // 提示信息
        add(pNorth, BorderLayout.NORTH); // 将北部面板添加到窗口

        add(puzzlePad.getHandleMove(), BorderLayout.SOUTH); // 添加底部操作面板

        // 窗口设置
        validate(); // 验证布局
        setVisible(true); // 设置可见
        setBounds(100, 50, 550, 380); // 设置窗口位置和大小
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭操作

        // 尝试加载默认图像
        try {
            image = tool.createImage(new File("拼图图像/default.jpg").toURI().toURL());
            puzzlePad.setImage(image);
        } catch (Exception e) {
            // 处理图像加载异常
        }
    }

    // 事件处理方法
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == startButton) { // 点击开始按钮
            if (digitPlay.isSelected()) { // 数字玩法被选中
                puzzlePad.setIsDigitPlay();
            } else if (imagePlay.isSelected()) { // 图像玩法被选中
                puzzlePad.setImage(image);
                puzzlePad.setIsImagePlay();
            }
        } else if (e.getSource() == oneGrade) { // 点击初级菜单项
            puzzlePad.setGrade(1);
        } else if (e.getSource() == twoGrade) { // 点击高级菜单项
            puzzlePad.setGrade(2);
        } else if (e.getSource() == newImage) { // 点击选择新图像菜单项
            FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif");
            JFileChooser chooser = new JFileChooser();
            chooser.setFileFilter(filter); // 设置文件过滤器
            int state = chooser.showOpenDialog(null); // 显示文件选择对话框
            File file = chooser.getSelectedFile(); // 获取用户选择的文件
            if (file != null && state == JFileChooser.APPROVE_OPTION) {
                try {
                    image = tool.createImage(file.toURI().toURL()); // 加载选中的图像
                    puzzlePad.setImage(image); // 设置为当前图像
                } catch (Exception exp) {
                    // 处理图像加载异常
                }
            }
        } else if (e.getSource() == defaultImage) { // 点击使用默认图像菜单项
            try {
                image = tool.createImage(new File("拼图图像/default.jpg").toURI().toURL()); // 加载默认图像
                puzzlePad.setImage(image);
            } catch (Exception exp) {
                // 处理图像加载异常
            }
        }
    }

    // 程序主入口
    public static void main(String[] args) {
        new AppWindow(); // 创建并显示主窗口
    }
}

